#include<iostream>
#include<unistd.h>
#include<pthread.h>
#include<string>
#include<cstdio>
#include<cstdlib>


// void showtid(pthread_t &tid)
// {
//     printf("tid: 0x%lx\n",tid);
// }

// std::string Format(pthread_t tid)
// {
//     char id[64];
//     snprintf(id,sizeof(id),"0x%lx",tid);
//     return id;
// }

// void *threadrun(void* args)
// {
//     std::string name=static_cast<const char*> (args);

//     pthread_t tid = pthread_self();
//     int cnt=5;
//     while(cnt--)
//     {
//         std::cout<<"我是新线程："<<name<<Format(tid)<<std::endl;
//         sleep(1);
//     }
//     return (void*)100;
// }

// int main()
// {
//     pthread_t tid;
//     int n = pthread_create(&tid,nullptr,threadrun,(void*)"thread-1");
//     (void)n;

//     showtid(tid);

//     int cnt=5;
//     while(cnt--)
//     {
//         std::cout<<"我是主线程：main pthread："<<Format(pthread_self())<<std::endl;
//         sleep(1);
//     }
//     void* ret = nullptr;
//     pthread_join(tid,&ret);
//     std::cout<<(long long int)ret<<std::endl;

//     return 0;
// }

// class Task
// {
// public:
//     Task(int a,int b):_a(a),_b(b){}
//     ~Task(){}
//     int Execute(){return _a+_b;}
// private:
//     int _a;
//     int _b;
// };

// class Result
// {
// public:
//     Result(int result):_result(result){}
//     ~Result(){}

//     int GetResult(){return _result;}
// private:
//     int _result;
// };

// void *pthreadrun(void* args)
// {
//     Task* t = static_cast<Task*> (args);//强转
//     sleep(100);
//     // int ret = t->Execute();
//     // Result* res = new Result(ret);
//     Result* res = new Result(t->Execute());//在创建一个对象，作为退出码
//     //return res;
//     //pthread_exit(res);
//     return nullptr;
// }

// int main()
// {
//     pthread_t tid;
//     Task* t = new Task(10,20);///新建一个对象，创建在对堆上
//     pthread_create(&tid,nullptr,pthreadrun,t);//创建新线程

//     pthread_cancel(tid);
//     std::cout<<"新线程被取消"<<std::endl;

//     void* ret=nullptr;
//     pthread_join(tid,&ret);
//     PTHREAD_CANCELED;
//     std::cout<<"新线程结束，运行结果："<<(long long)ret<<std::endl;

//     // Result* ret=nullptr;//ret作为经过新线程后的输出结果
//     // pthread_join(tid,(void**)&ret);//等待新线程结束，因为要修改ret，所以要使用二级指针
//     // int n=ret->GetResult();
//     // std::cout<<"新线程结束，值为："<<n<<std::endl;

//     // delete t;
//     // delete ret;
//     return 0;
// }

// class Task
// {
// public:
//     Task(int a,int b):_a(a),_b(b){}
//     ~Task(){}
//     void Execute(){_result=_a+_b;return;}
//     int GetResult(){return _result;}
// private:
//     int _a;
//     int _b;
//     int _result;
// };

// // class Result
// // {
// // public:
// //     Result(int result):_result(result){}
// //     ~Result(){}

// //     int GetResult(){return _result;}
// // private:
// //     int _result;
// // };

// void *pthreadrun(void* args)
// {
//     Task* t = static_cast<Task*> (args);//强转
    
//     // int ret = t->Execute();
//     // Result* res = new Result(ret);
//     //Result* res = new Result(t->Execute());//在创建一个对象，作为退出码
//     sleep(3);
//     t->Execute();
//     //return t;
//     pthread_exit(t);
// }

// int main()
// {
//     pthread_t tid;
//     Task* t = new Task(20,20);///新建一个对象，创建在对堆上
//     pthread_create(&tid,nullptr,pthreadrun,t);//创建新线程

//     Task* ret=nullptr;//ret作为经过新线程后的输出结果
//     pthread_join(tid,(void**)&ret);//等待新线程结束，因为要修改ret，所以要使用二级指针
//     int n=ret->GetResult();
//     std::cout<<"新线程结束，值为："<<n<<std::endl;

//     delete t;
//     return 0;
// }


void* pthreadrun(void* args)
{
    pthread_detach(pthread_self());
    std::string name = static_cast<char*>(args);
    std::cout<<"我是新线程,name: "<<name<<std::endl;
    return nullptr;
}

int main()
{
    pthread_t tid;
    int n = pthread_create(&tid,nullptr,pthreadrun,(void*)"thread-1");
    //pthread_detach(tid);//分离
    if(n!=0)
    {
        std::cout<<"create thread error"<<std::endl;
        return 1;
    }
    sleep(1);////很重要，要让线程先分离，再等待
    
    int num = pthread_join(tid,nullptr);
    if(num==0)
    {
        std::cout<<"wait success"<<std::endl;
    }
    else
    {
        std::cout<<"wait failed"<<std::endl;
    }
    return 0;
}